/**
 * @File Name: sqlconnpool.h
 * @brief  数据库连接池SqlConnPool
 * @Author : beyon_sir email:caoboyang.chn@gmail.com
 * @Version : 1.0
 * @Create Date : 2022-11-21
 * 
 */
#ifndef SQLCONNPOOL_H
#define SQLCONNPOOL_H

#include <mysql/mysql.h>
#include <string>
#include <queue>
#include <mutex>
#include <semaphore.h>
#include <thread>
#include "../log/log.h"

/// @brief 数据库连接池(单例模式)
class SqlConnPool {
public:
    static SqlConnPool *Instance();                 // 单例模式: 接口函数：获取静态化的SqlConnPool实例 私有化构造函数

    MYSQL *GetConn();                               // 获取一个连接
    void FreeConn(MYSQL * conn);                    // 释放一个连接(将当前连接MySQL* 置为空闲)
    int GetFreeConnCount();                         // 获取 空闲连接数

    void Init(const char* host, int port,           // 主机名 端口
              const char* user,const char* pwd,     // 用户名 密码
              const char* dbName, int connSize);    // 数据库名 连接数大小
    void ClosePool();                               // 关闭数据库连接池

private:
    SqlConnPool();                                  // 私有化构造函数
    ~SqlConnPool();                                 // 私有化析构函数

    int MAX_CONN_;                                  // 最大的连接数
    int useCount_;                                  // 当前的连接数(用户数)
    int freeCount_;                                 // 空闲连接数

    std::queue<MYSQL *> connQue_;                   // 队列 (MYSQL* )
    std::mutex mtx_;                                // 互斥锁
    sem_t semId_;                                   // 信号量
};


#endif // SQLCONNPOOL_H